package com.selenium;

import org.openqa.selenium.*;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.Point;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.awt.*;
import java.util.*;
import java.awt.event.KeyEvent;
import java.util.List;

public class SeleniumTest {

    private static String baseUrl = "http://221.203.62.186:8188";

    private static Robot robot;

    static {
        try {
            robot = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) throws InterruptedException, AWTException {
        //下拉列表数组
        Map<String,String> selectList = new TreeMap<String,String>() {
            {
                put("1", "办公自动化设备");
                put("2", "电器设备");
                put("3", "广播、电视、电影设备");
//                put("4", "办公耗材");
//                put("5", "A020101 计算机设备");
//                put("6", "A020102 计算机网络设备");
//                put("8", "A020105 存储设备");
//                put("9", "其他");
//                put("10", "A020106 输入输出设备");
//                put("11", "A0202 办公设备");
//                put("12", "A020211 销毁设备");
//                put("13", "A020212 条码打印机");
                put("14", "A020214 会计机械");
                put("15", "其他");
                put("16", "A020618 生活用电器");
                put("17", "其他");
                put("18", "A020910 电视设备");
                put("19", "其他");
//                put("20", "A0901 纸制文具及办公用品");
//                put("21", "A0902 硒鼓、粉盒");
//                put("22", "A0904 文教用品");
//                put("23", "A0905 清洁用品");
//                put("24", "其他");
//                put("25", "A02010104 台式计算机");
//                put("26", "A02010105 便携式计算机");
//                put("27", "A02010106 掌上电脑");
//                put("28", "A02010107 平板式微型计算机");
//                put("29", "其他");
//                put("30", "A02010201 路由器");
//                put("31", "其他");
//                put("32", "A0201060101 喷墨打印机");
//                put("33", "A0201060102 激光打印机");
//                put("34", "A0201060103 热式打印机");
//                put("35", "A0201060104 针式打印机");
//                put("36", "其他");
//                put("37", "A02010508 移动存储设备");
//                put("38", "其他");
//                put("40", "A02010604 显示设备");
//                put("41", "A02010607 一般输入设备");
//                put("42", "A02010608 识别输入设备");
//                put("43", "A0201060901 扫描仪");
//                put("44", "其他");
//                put("45", "A020201 复印机");
//                put("46", "A020202 投影仪");
//                put("47", "A020203 投影幕");
//                put("48", "A020204 多功能一体机");
//                put("49", "A0202050102 通用照相机");
//                put("50", "A020206 电子白板");
//                put("51", "A020207 LED显示屏");
//                put("52", "A020209 刻录机");
//                put("53", "A02080701 固定电话机");
//                put("54", "A02081001 传真通信设备");
//                put("55", "其他");
//                put("56", "A02021101 碎纸机");
//                put("57", "A02021102 光盘粉碎机");
//                put("58", "A02021103 硬盘粉碎机");
//                put("59", "其他");
//                put("60", "A02021401 计算器");
                put("61", "其他");
                put("62", "A02061801 制冷电器");
                put("63", "A02061802 空气调节电器");
                put("64", "A02061805 烹调电器");
                put("65", "A02061807 饮水器");
                put("66", "A02061808 热水器");
                put("67", "其他");
                put("68", "普通电视设备（电视机）");
                put("69", "其他");
//                put("70", "A090101 复印纸");
//                put("71", "A090102 信纸");
//                put("72", "A090103 信封");
//                put("73", "A090104 其他纸制品");
//                put("74", "其他");
//                put("75", "A090201 鼓粉盒");
                put("76", "A090202 粉盒");
//                put("77", "A090203 喷墨盒");
//                put("78", "A090204 墨水盒");
//                put("79", "A090205 色带");
//                put("80", "其他");
//                put("81", "A090401 文具");
//                put("82", "A090402 笔");
//                put("83", "其他");
//                put("84", "A090501 卫生用纸制品");
//                put("85", "A090502 消毒杀菌用品");
//                put("86", "A090503 肥（香）皂和合成洗涤剂");
//                put("87", "其他");
//                put("88", "闪存盘（U盘）");
//                put("89", "移动硬盘");
//                put("90", "软盘");
//                put("91", "光盘");
//                put("92", "其他");
//                put("93", "显示器");
//                put("94", "A0201060101 喷墨打印机");
//                put("95", "A0201060102 激光打印机");
//                put("96", "A0201060103 热式打印机");
//                put("97", "A0201060104 针式打印机");
//                put("98", "液晶显示器");
//                put("99", "阴极射线管显示器");
//                put("100", "等离子显示器");
//                put("101", "其他");
//                put("102", "键盘");
//                put("103", "鼠标");
//                put("104", "其他");
//                put("105", "刷卡机");
//                put("106", "考勤机");
//                put("107", "其他");
//                put("108", "简易型计算器");
//                put("109", "函数型计算器");
//                put("110", "可编程序计算器");
//                put("111", "其他");
                put("112", "电饭锅");
                put("113", "微波炉");
                put("114", "其他");
                put("115", "A02010601 打印设备");
                put("116", "A0201060101 喷墨打印机");
                put("117", "A0201060102 激光打印机");
                put("118", "A0201060103 热式打印机");
                put("119", "A0201060104 针式打印机");
                put("120", "其他");
            }
        };


        // 设置驱动EXE地址 取相对路径
        System.setProperty("webdriver.chrome.driver", ".\\src\\main\\java\\com\\selenium\\chromedriver.exe");

        // 创建浏览器对象
        WebDriver driver = new ChromeDriver();

        // 打开网页
        driver.get(SeleniumTest.baseUrl + "/admin/Index/index.html");

        driver.manage().window().setSize(new Dimension(1340,1045));

        driver.manage().window().setPosition(new Point(0,0));

        // 输入用户名
        driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("test");
        // 输入密码
        driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("a123456");

        String yancode = null;
        // 获取验证码输入长度等于4才跳出
        do {
            // 获取输入验证码的输入框
            WebElement inputCode = driver.findElement(By.xpath("//*[@id=\"averfiy\"]"));
            // 获取输入框文本
            yancode = inputCode.getAttribute("value");
            System.out.println("验证码长度:" + yancode.length());
            // 战术延时
            Thread.sleep(500);
            // 长度不等于4继续循环
        } while (yancode.length() != 4);

        // 点击登入按钮
        driver.findElement(By.xpath("//*[@id=\"login\"]")).click();

        // 等待直到显示得到商品管理
        WebElement comManager = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"side-menu\"]/li[4]/a/span[1]")));
        System.out.println(comManager.getText());

        Thread.sleep(1500);
        // 点击商品管理列表
        comManager.click();
        Thread.sleep(1500);
        // 点击商品列表
        driver.findElement(By.xpath("//*[@id=\"side-menu\"]/li[4]/ul/li[2]/a/span")).click();
        Thread.sleep(1500);

        // 切换到iframe 框架内
        WebElement iframe = new WebDriverWait(driver,7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"content-main\"]/iframe[2]")));
//        WebElement iframe = driver.findElement(By.xpath("//*[@id=\"content-main\"]/iframe[2]"));
        driver.switchTo().frame(iframe);
        // 得到select 对象
        WebElement select = driver.findElement(By.xpath("//*[@id=\"catagory_id\"]"));
        // 创建select选择
        Select selectObject = new Select(select);

        // 循环下拉列表数组
        Set<String> keys = selectList.keySet();

        for (String key: keys){
            operationWindow(driver,iframe, selectObject, SeleniumTest.baseUrl, key);
        }

//        operationWindow(driver,iframe,selectObject,SeleniumTest.baseUrl,"办公自动化设备");

        driver.close();
        driver.quit();
        System.out.println("程序执行结束");

    }

    public static void operationWindow(WebDriver driver, WebElement iframe, Select selectObject, String baseUrl, String selectValue) throws InterruptedException, AWTException {

        // 商品标题
        String comInfo= null;
        Integer total = 0;

        // 选中选项
        selectObject.selectByValue(selectValue);
        // 点击搜索按钮
        driver.findElement(By.xpath("//*[@id=\"searchGroup\"]/div[4]/button")).click();
        Thread.sleep(1500);

        List<WebElement> numss = driver.findElements(By.xpath("//li[@class=\"page-number\" or @class=\"page-number active\"]"));

        if (numss != null || numss.size() != 0) {
            // 只有一页的情况下
            if (numss.size() == 1) {
                total = 1;
            } else {
                //多页的情况下
                System.out.println("首页序号:" + numss.get(0).getText());
                // 判断序号1 的页面是否包含active激活 class值 没有则激活
                if (!numss.get(0).getAttribute("class").contains("active")) {
                    // 查找连接的内容进行点击
                    driver.findElement(By.linkText("1")).click();
                }
                // 延时
                Thread.sleep(1500);

                // 取多页省略的情况下的最后一个按钮
                WebElement pageLast = null;
                List<WebElement> nums;
                try{
                    pageLast = driver.findElement(By.xpath("//li[@class=\"page-last\"]"));
                    // 有page-last按钮的时候取这个最后一页数字
                    total = Integer.parseInt(pageLast.getText());
                }catch (NoSuchElementException e){
                    System.out.println("没有找到page-last");

                    if (pageLast == null) {
                        // 获取所有翻页按钮
                        nums = driver.findElements(By.xpath("//li[@class=\"page-number\" or @class=\"page-number active\"]"));
                        // 计算当前页总有多少条商品
                        total = Integer.parseInt(nums.get(nums.size() - 1).getText());

                    }
                }
                System.out.println("总页数:" + total);
            }
            // 设置当前页数
            int page = 1;
            for (int j = 1; j <= total; j++) {

                // 翻页箭头
    //        WebElement left = driver.findElement(By.xpath("//a[text(),'‹']"));
                WebElement right = driver.findElement(By.xpath("//li[@class=\"page-next\"]/a[@href='#']"));
                System.out.println("翻页:" + right.getText());

                if (page > j) {
                    right.click();
                    Thread.sleep(1500);
                } else {

                    // 获取表格操作标题
                    WebElement caozuoTile = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"CodeGoodsTable\"]/thead/tr/th[10]/div[1]")));
                    System.out.println("操作标题:" + caozuoTile.getText());

                    List<WebElement> trs = driver.findElements(By.xpath("//*[@id=\"CodeGoodsTable\"]/tbody/tr"));
                    System.out.println("列表数:" + trs.size());

                    int size = trs.size();

                    WebElement reiframe = null;

                    // 一个大的循环20个
                    // 如果出现了异常可以修改下面的1为当前商品的索引可以接着继续
                    for (int i = 1; i <= size; i++) {

                        WebElement currentChangeBtn = null;
    //                Thread.sleep(3000);

                        // 填充字段和得到商品信息
                        ShopEntity shopEntity = getJD(driver);

                        // 切换到iframe 框架内
                        reiframe = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"content-main\"]/iframe[2]")));
                        driver.switchTo().frame(reiframe);

                        try {
                            if (trs.size() == 1) {
                                currentChangeBtn = driver.findElement(By.xpath("//*[@id=\"CodeGoodsTable\"]/tbody/tr/td[10]/button[1]"));
                                currentChangeBtn = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"CodeGoodsTable\"]/tbody/tr/td[10]/button[1]")));
                                System.out.println("二次curren:");
                            } else {

                                // 等待修改按钮出现
                                currentChangeBtn = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"CodeGoodsTable\"]/tbody/tr[" + i + "]/td[11]/button[1]")));
                                // td[11] 是 11 的情况下
                                if (currentChangeBtn == null) {
                                    currentChangeBtn = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"CodeGoodsTable\"]/tbody/tr[" + i + "]/td[10]/button[1]")));
                                }

    //                            currentChangeBtn = driver.findElement(By.xpath("//*[@id=\"CodeGoodsTable\"]/tbody/tr[" + i + "]/td[10]/button[1]"));
                                System.out.println("curren:" + currentChangeBtn);
                            }

                            // 如果按钮不存在则 跳出循环
                            if (currentChangeBtn == null) {

                                // 结束循环
                                break;
                            }

                        } catch (Exception e) {
                            System.err.println("超时异常有可能当前分类执行完成");
    //                        e.printStackTrace();
    //                        driver.close();
    //                        driver.quit();

                            // 当前分类任务完毕之后的退出标志
                        } finally {

                            System.err.println("当前分类:" + selectValue);
                            System.err.println("总页数:" + total);
                            System.err.println("第" + j + "页");
                            System.err.println("当页总条数:" + size);
                            System.err.println("当前索引第几个:" + i);
                            System.err.println("当前索引已完成该下一个");
                        }


                        Thread.sleep(1000);
                        // 点击修改按钮
                        currentChangeBtn.click();

                        // 等待修改 dialog弹窗出现xpath使用了正则    //*[re:match(@id,'layui-layer-iframe\d+')]
                        WebElement dialog = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//iframe[@scrolling=\"auto\" and @allowtransparency=\"true\"]")));
                        // 切换到iframe修改框架内
                        driver.switchTo().frame(dialog);
                        System.out.println("切换到Dialog > iframe弹窗");

                        // 获取弹出窗口的内容信息
                        getComInfo(driver, baseUrl, reiframe, dialog, shopEntity);
                    }

                    // 这块的延时必须加不然会导致下一页箭头获取不到 click 就异常
                    Thread.sleep(3000);
                    // 切换到iframe 框架内
                    reiframe = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"content-main\"]/iframe[2]")));
    //                WebElement iframe = driver.findElement(By.xpath("//*[@id=\"content-main\"]/iframe[2]"));
                    driver.switchTo().frame(reiframe);
                    // 得到翻页箭头 >
                    right = new WebDriverWait(driver, 7).until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@class=\"page-next\"]/a[@href=\"#\"]")));
                    // 输出翻页
                    System.out.println("翻页:" + right.getText());

                    Thread.sleep(1000);
                    // 判断当前页是否是最后一页
                    if (total == j) {
                        System.out.println("最后一页结束");
                    } else {
                        // 点击下一页
                        right.click();
                        System.out.println("下一页");
                    }

                }

                // 延时下
                Thread.sleep(3000);
            }

        }

    }

    public static void getComInfo(WebDriver driver, String baseUrl, WebElement iframe, WebElement dialog, ShopEntity shopEntity) throws InterruptedException {

        // 取商品标题
        WebElement comTitle = driver.findElement(By.xpath("//*[@id=\"goods_name\"]"));
        System.out.println("商品标题:" + comTitle.getAttribute("value"));

        // 获取商品单价
        WebElement price = driver.findElement(By.xpath("//*[@id=\"goods_price\"]"));
        System.out.println("商品单价:" + price.getAttribute("value"));

        // 取图片url进行拼接
        WebElement imgurl = driver.findElement(By.xpath("//*[@id=\"pic\"]"));
        System.out.println("图片url:" + baseUrl + imgurl.getAttribute("value"));

        // 取关键字
        WebElement inputKeyWord = driver.findElement(By.xpath("//*[@id=\"gjz\"]"));
//        System.out.println("关键字:" + inputKeyWord.getAttribute("value"));
        // 设置关键字
        inputKeyWord.clear();
        inputKeyWord.sendKeys(shopEntity.getSearch());

        // 取网址
        WebElement inputIink = driver.findElement(By.xpath("//*[@id=\"web\"]"));
//        System.out.println("网址:" + inputIink.getAttribute("value"));
        // 设置连接
        inputIink.clear();
        // 设置url连接地址
        inputIink.sendKeys(shopEntity.getShopUrl());

        // 取平均价格
        WebElement inputAvgPrice = driver.findElement(By.xpath("//*[@id=\"pjjg\"]"));
//        System.out.println("平均价格:" + inputAvgPrice.getAttribute("value"));
        // 清除平均价格
        inputAvgPrice.clear();
        // 设置平均价格
        inputAvgPrice.sendKeys(shopEntity.getPrice());
        // 减缓延时
        Thread.sleep(1000);
        // 清除平均价格
        inputAvgPrice.clear();
        // 设置平均价格
        inputAvgPrice.sendKeys(shopEntity.getPrice());

        // 取数量
//        WebElement inputNum = driver.findElement(By.xpath("//*[@id=\"num\"]"));
//        System.out.println("平均价格:" + inputNum.getAttribute("value"));

        // 取确认按钮
        WebElement confirmBtn = driver.findElement(By.xpath("//*[@id=\"ensure\"]"));
//        WebElement cancelBtn = driver.findElement(By.xpath("//*[@id=\"cancel\"]"));
        System.out.println("确认按钮:" + confirmBtn.getText());
//        System.out.println("取消按钮:" + cancelBtn.getText());
        // 点击确认按钮
        confirmBtn.click();
    }


    /**
     * 获取京东商品信息
     * @param driver
     * @return
     * @throws InterruptedException 线程异常类
     * @throws AWTException
     */
    public static ShopEntity getJD(WebDriver driver) throws InterruptedException {

        // 京东存储句柄
        String jdHandler = "";
        // 存储搜索关键字文本
        String searchTxt = "";
        // 商品页句柄
        String shopPage ="";
        // 商品页的URL地址
        String shopUrl ="";

        // 获取市政府窗口句柄
        String hcHandler = driver.getWindowHandle();

        // 打开一个新窗口切换到该窗口
        driver.switchTo().newWindow(WindowType.TAB);

        // 转到京东
        driver.get("https://www.jd.com/");

        // 循环执行，直到找到一个新的窗口句柄
        for (String windowHandle : driver.getWindowHandles()) {
            if (!hcHandler.contentEquals(windowHandle)) {

                // 将JD句柄保存下来
                jdHandler = windowHandle;
                break;
            }
        }

        // 得到搜索框
        WebElement searchInput = new WebDriverWait(driver,7).until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"key\"]")));

        System.err.println("得到搜索框");

        //得到搜索框内容  可能存在搜索框页面没有加载完成进行点击选择商品的时候存在错误
        do {
            searchTxt = searchInput.getAttribute("value");

            Thread.sleep(500);
        } while (searchTxt.length() <= 0);

        System.out.println("搜索框文本:" + searchTxt);

        // 循环执行，直到找到一个新的窗口句柄
        boolean boflag = false;
        do {
            for (String windowHandle : driver.getWindowHandles()) {
                if (!hcHandler.contentEquals(windowHandle)) {

                    if (!jdHandler.contentEquals(windowHandle)) {

                        // 得到商品页句柄
                        shopPage = windowHandle;
                        // 赋值为true  跳出do  while循环
                        boflag = true;
                        break;
                    }
                }
            }
        } while (!boflag);

        // 创建构造体
        ShopEntity shopEntity = new ShopEntity();

        // 切换到商品页面
        driver.switchTo().window(shopPage);

        // 按键ESC 停止网页加载
        System.out.println("网页加载延时5秒,超过5秒自动停止加载");
        Thread.sleep(2000);
        // 发送ESC按键,取消网页继续加载
        robot.keyPress(KeyEvent.VK_ESCAPE);

        // 取当前URL地址
        System.out.println("商品url:" + driver.getCurrentUrl());
        // 商品的URL设置到商品对象内
        shopEntity.setShopUrl(driver.getCurrentUrl());

        // 取当前页面价钱
        WebElement price = new WebDriverWait(driver,10).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class=\"p-price\"]")));
        // ￥939.00
        System.out.println("商品价钱:" + price.getText());
        // 空格分割
        String[] splitPrice = price.getText().split("￥");
        System.out.println("价钱:" + splitPrice[1].trim());
        shopEntity.setPrice(splitPrice[1]);

        // 设置搜索关键字到商品对象内
        shopEntity.setSearch(searchTxt);

        // 关闭当前商品页面页面窗口
        driver.close();

        Thread.sleep(1000);

        // 切换回JD页面
        driver.switchTo().window(jdHandler);

        // 得到搜索框内容 可能存在搜索框页面没有加载完成进行点击选择商品的时候存在错误
//        do{
//            searchTxt = searchInput.getAttribute("value");
//            Thread.sleep(500);
//        } while (searchTxt.length() <= 0);
//
//        System.out.println("搜索框文本:" + searchTxt);

        // 关闭当前商品页面页面窗口
        driver.close();

        Thread.sleep(1000);

        // 切换回海城页面
        driver.switchTo().window(hcHandler);
        return shopEntity;
    }
}
